package main

import (
	"encoding/json"
	"fmt"
	"os"
	"path/filepath"
	"strings"
	"time"

	"mcp-server/internal/docprocessor"
	"mcp-server/internal/types"
)

func main() {
	fmt.Println("=== 样本知识文件批量分片测试 ===")

	// 样本文件目录
	sampleDir := "../docs/样本知识 国资委监管制度"

	// 创建处理器
	processor := docprocessor.NewDocumentProcessor()

	// 创建结果目录
	if err := os.MkdirAll("results/samples", 0755); err != nil {
		fmt.Printf("创建结果目录失败: %v\n", err)
		return
	}

	// 遍历样本文件
	err := filepath.Walk(sampleDir, func(path string, info os.FileInfo, err error) error {
		if err != nil {
			return err
		}

		// 只处理.md和.txt文件
		if info.IsDir() || (!strings.HasSuffix(strings.ToLower(path), ".md") && !strings.HasSuffix(strings.ToLower(path), ".txt")) {
			return nil
		}

		fmt.Printf("\n处理文件: %s\n", path)
		fmt.Printf("文件大小: %d bytes\n", info.Size())

		// 处理文件
		startTime := time.Now()
		result, err := processor.ProcessFile(path)
		processingTime := time.Since(startTime)

		if err != nil {
			fmt.Printf("❌ 处理失败: %v\n", err)
			return nil
		}

		// 显示处理结果
		fmt.Printf("✅ 处理成功!\n")
		fmt.Printf("   总行数: %d\n", result.Document.TotalLines)
		fmt.Printf("   分片数: %d\n", result.Document.TotalChunks)
		fmt.Printf("   处理时间: %v\n", processingTime)

		// 统计语义标签
		tagStats := make(map[string]int)
		totalChars := 0
		for _, chunk := range result.Chunks {
			if chunk.SemanticTag != "" {
				tagStats[chunk.SemanticTag]++
			}
			totalChars += len([]rune(chunk.Content))
		}

		fmt.Printf("   总字符数: %d\n", totalChars)
		if len(tagStats) > 0 {
			fmt.Printf("   语义标签统计:\n")
			for tag, count := range tagStats {
				fmt.Printf("     %s: %d个\n", tag, count)
			}
		}

		// 显示前3个分片示例
		fmt.Printf("   分片示例:\n")
		for i, chunk := range result.Chunks {
			if i >= 3 {
				break
			}
			preview := chunk.Content
			if len([]rune(preview)) > 80 {
				preview = string([]rune(preview)[:80]) + "..."
			}
			tagInfo := ""
			if chunk.SemanticTag != "" {
				tagInfo = fmt.Sprintf(" [%s]", chunk.SemanticTag)
			}
			fmt.Printf("     分片%d (行%d-%d)%s: %s\n", i+1, chunk.StartLine, chunk.EndLine, tagInfo, preview)
		}

		// 保存结果
		fileName := strings.TrimSuffix(filepath.Base(path), filepath.Ext(path))
		outputFile := fmt.Sprintf("results/samples/%s_chunks.json", fileName)

		jsonData, err := json.MarshalIndent([]*types.SplitResult{result}, "", "  ")
		if err != nil {
			fmt.Printf("❌ JSON序列化失败: %v\n", err)
			return nil
		}

		if err := os.WriteFile(outputFile, jsonData, 0644); err != nil {
			fmt.Printf("❌ 保存文件失败: %v\n", err)
			return nil
		}

		fmt.Printf("   结果已保存: %s\n", outputFile)
		return nil
	})

	if err != nil {
		fmt.Printf("遍历文件失败: %v\n", err)
		return
	}

	fmt.Println("\n=== 批量测试完成 ===")

	// 显示结果文件列表
	fmt.Println("\n生成的结果文件:")
	resultsDir := "results/samples"
	files, err := os.ReadDir(resultsDir)
	if err != nil {
		fmt.Printf("读取结果目录失败: %v\n", err)
		return
	}

	for _, file := range files {
		if !file.IsDir() {
			fmt.Printf("  %s\n", filepath.Join(resultsDir, file.Name()))
		}
	}
}
